package py.fpuna.ii.electiva2.eao;

import java.util.ArrayList;
import java.util.Iterator;
import py.fpuna.ii.electiva2.interfaces.ProductoEAO;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import py.fpuna.ii.electiva2.dto.ProductoDTO;
import py.fpuna.ii.electiva2.dto.ProveedorDTO;
import py.fpuna.ii.electiva2.entity.Producto;
import py.fpuna.ii.electiva2.entity.Proveedor;
import py.fpuna.ii.electiva2.interfaces.ProductoEAORemote;

/**
 *
 * @author lizg
 */
@Stateless
public class ProductoEAOBean implements ProductoEAO, ProductoEAORemote {
    @PersistenceContext
    private EntityManager em;

    public boolean create(ProductoDTO producto) throws Exception {
        boolean retorno = false;

        Proveedor prov = new Proveedor(producto.getProdProveedor().getProvCodigo());

        Producto entidad = new Producto(producto.getProdCodigo(),
                producto.getProdDescripcion(),
                producto.getProdCantidad(),
                producto.getProdPrecioCompra(),
                producto.getProdPrecioVenta(),
                prov
        );
        try {
            em.persist(entidad);
            retorno = true;
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }
    
    public void edit(ProductoDTO producto) {

        Proveedor prov = new Proveedor(producto.getProdProveedor().getProvCodigo());

        Producto entidad = new Producto(producto.getProdCodigo(),
                producto.getProdDescripcion(),
                producto.getProdCantidad(),
                producto.getProdPrecioCompra(),
                producto.getProdPrecioVenta(),
                prov
        );

        try {
            Producto productomng = em.merge(entidad);
            em.merge(productomng);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * el metodo de lau que modifica entidades producto
     * @param producto entidad del tipo Producto
     */
    public void editE(Producto producto) {
        try {
            Producto productomng = em.merge(producto);
            em.merge(productomng);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void remove(ProductoDTO producto) {

        Proveedor prov = new Proveedor(producto.getProdProveedor().getProvCodigo());

        Producto entidad = new Producto(producto.getProdCodigo(),
                producto.getProdDescripcion(),
                producto.getProdCantidad(),
                producto.getProdPrecioCompra(),
                producto.getProdPrecioVenta(),
                prov
        );

        Producto clientmng = em.merge(entidad);
        em.remove(clientmng);
    }


    /**
     * busca productos segun un criterio, en este caso la descripcion
     * @param condicion
     * @return lista de productos q cumplen la condicion
     */
     public List<ProductoDTO> getProductosByDes(String condicion) {
        List<ProductoDTO> retorno = null;
        List<Producto> productList = null; //para guardar resultado del em
        Query q = null;
        try {
            if(condicion == null || condicion.length() == 0){
                retorno = this.findAll();
            }else{
                String regexp = "%"+condicion+"%";  //busca todo lo que empiece con "condicion"
                q = em.createQuery("select p from Producto p WHERE lower(p.prodDescripcion) LIKE ?1 ").setParameter(1, regexp);
            }
            // recuperamos la lista
            productList = q.getResultList();

            Iterator <Producto> itProd = productList.iterator();

            retorno = new ArrayList<ProductoDTO>();

            while(itProd.hasNext()){
                Producto prod = itProd.next();
                ProductoDTO prodDto = new ProductoDTO();

                prodDto.setProdDescripcion(prod.getProdDescripcion());
                prodDto.setProdCodigo(prod.getProdCodigo());
                prodDto.setProdCantidad(prod.getProdCantidad());
                prodDto.setProdPrecioCompra(prod.getProdPrecioCompra());
                prodDto.setProdPrecioVenta(prod.getProdPrecioVenta());

                ProveedorDTO provDto = new ProveedorDTO();
                provDto.setProvCodigo(prod.getProdProveedor().getProvCodigo());
                provDto.setProvRazonSocial(prod.getProdProveedor().getProvRazonSocial());
                provDto.setProvDireccion(prod.getProdProveedor().getProvDireccion());
                provDto.setProvTelefono(prod.getProdProveedor().getProvTelefono());
                prodDto.setProdProveedor(provDto);

                retorno.add(prodDto);
            }

        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }



    public ProductoDTO find(Integer id) {
        ProductoDTO retorno = null;
        Producto entidad = new Producto();
        try {
            Query q = em.createNamedQuery("Producto.findByProdCodigo").setParameter("prodCodigo", id);
            entidad = (Producto)q.getSingleResult();

            ProveedorDTO prov = new ProveedorDTO();
            prov.setProvCodigo(entidad.getProdProveedor().getProvCodigo());
            prov.setProvRazonSocial(entidad.getProdProveedor().getProvRazonSocial());
            prov.setProvDireccion(entidad.getProdProveedor().getProvDireccion());
            prov.setProvTelefono(entidad.getProdProveedor().getProvTelefono());

            retorno = new ProductoDTO(entidad.getProdCodigo(),
                    entidad.getProdDescripcion(),
                    entidad.getProdCantidad(),
                    entidad.getProdPrecioCompra(),
                    entidad.getProdPrecioVenta(),
                    prov
            );
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
       }


    /**
     * el metodo de lau que busca y retorna una entidad
     * @return la entidad Producto
     */
    public Producto findE(Integer id) {
        Producto entidad = new Producto();
        try {
            Query q = em.createNamedQuery("Producto.findByProdCodigo").setParameter("prodCodigo", id);
            entidad = (Producto)q.getSingleResult();

        } catch (Exception e) {
            throw e;
        }finally{
            return entidad;
        }
       }


    public List<ProductoDTO> findAll() {

       List<Producto> prodList = em.createQuery("select object(o) from Producto as o").getResultList();

        List<ProductoDTO> prodDtoList = new ArrayList<ProductoDTO>();

        Iterator <Producto> itProd = prodList.iterator();

        while(itProd.hasNext()){
            Producto prod = itProd.next();
            ProductoDTO prodDto = new ProductoDTO();

            prodDto.setProdDescripcion(prod.getProdDescripcion());
            prodDto.setProdCodigo(prod.getProdCodigo());
            prodDto.setProdCantidad(prod.getProdCantidad());
            prodDto.setProdPrecioCompra(prod.getProdPrecioCompra());
            prodDto.setProdPrecioVenta(prod.getProdPrecioVenta());

            ProveedorDTO provDto = new ProveedorDTO();
            provDto.setProvCodigo(prod.getProdProveedor().getProvCodigo());
            provDto.setProvRazonSocial(prod.getProdProveedor().getProvRazonSocial());
            provDto.setProvDireccion(prod.getProdProveedor().getProvDireccion());
            provDto.setProvTelefono(prod.getProdProveedor().getProvTelefono());
            prodDto.setProdProveedor(provDto);
            
            prodDtoList.add(prodDto);
        }

        return prodDtoList;
    }


    public List<ProductoDTO> getListaProductos(String condicion) throws Exception {
        List<ProductoDTO> retorno = new ArrayList();
        List<Producto> prodList = new ArrayList();
        Query q = null;
        try {
            if(condicion == null || condicion.length() == 0)
                q = em.createNamedQuery("Producto.findAll");
            else
                q = em.createQuery("select p from Producto p " + condicion + " order by p.prodCodigo");
            // recuperamos la lista
            prodList = (List<Producto>)q.getResultList();

            for (Producto prod : prodList) {
               ProductoDTO prodDto = new ProductoDTO();

               prodDto.setProdCodigo(prod.getProdCodigo());
               prodDto.setProdDescripcion(prod.getProdDescripcion());
               prodDto.setProdCantidad(prod.getProdCantidad());
               prodDto.setProdPrecioCompra(prod.getProdPrecioCompra());
               prodDto.setProdPrecioVenta(prod.getProdPrecioVenta());

               ProveedorDTO provDto = new ProveedorDTO();
               provDto.setProvCodigo(prod.getProdProveedor().getProvCodigo());
               provDto.setProvRazonSocial(prod.getProdProveedor().getProvRazonSocial());
               provDto.setProvTelefono(prod.getProdProveedor().getProvTelefono());
               prodDto.setProdProveedor(provDto);
               
               retorno.add(prodDto);
            }

        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }finally{
            return retorno;
        }
    }

}
